"""数据库配置"""
from sqlalchemy import event
from sqlalchemy.orm import Session
from functools import wraps
from sqlmodel import Session, create_engine

host = '0.0.0.0'
"""服务器监听的主机地址"""

port = 5432
"""端口号"""

debug = True
"""是否启用调试模式"""

SECRET_KEY = b'WQTcDQi7S-B51TH-f1LPTiLhfD-NueY1t6K0u4B45ss='
"""加密使用的32字节秘钥"""

#使用sqlite

data = "./data.db"
"""数据库文件路径"""
sqlite_url = f"sqlite:///{data}?check_same_thread=False"
engine = create_engine(sqlite_url)
# 通过 lambda 表达式直接设置外键
event.listen(engine, "connect", lambda c, _: c.execute("PRAGMA foreign_keys=ON"))
"""数据库对象"""

"""
#使用pgsql

PG_CONFIG = {
    "host": "localhost",      # PostgreSQL 服务器地址
    "port": "5400",           # PostgreSQL 端口，默认是 5432
    "user": "postgres",  # 数据库用户名
    "password": "123456",  # 数据库密码
    "database": "NameCardBook_database"   # 数据库名称
}
# 构建 PostgreSQL 连接 URL
postgres_url = f"postgresql://{PG_CONFIG['user']}:{PG_CONFIG['password']}@{PG_CONFIG['host']}:{PG_CONFIG['port']}/{PG_CONFIG['database']}"
# 创建数据库引擎
engine = create_engine(
    postgres_url,
    pool_size=10,        # 连接池大小
    max_overflow=5,      # 连接池最大溢出数量
    pool_timeout=30,     # 获取连接的超时时间（秒）
    pool_recycle=1800    # 连接回收时间（秒）
)
"""

def auto_session(func):
    """
    自动处理数据库会话
    一般是访问数据库的方法会使用这个装饰器
    注意：携带此装饰器的方法在一般调用时不用写session参数，此装饰器会自动创建一个；
        携带此装饰器的方法在调用另一个携带此装饰器的方法时，必须传递session参数，且必须以session = session 的形式传递
        举例：
        @auto_session
        def 方法b(... , session: Session = None):
            ...

        调用方法b:方法b(...)，此处不用写session参数

        在方法a中调用方法b：
        @auto_session
        def 方法a(... , session: Session = None):
            方法b(... , session = session)，此处必须加上session参数
            ...
    """
    @wraps(func)
    def wrapper(*args, **kwargs):
        # 如果调用时未传递 session，自动创建
        if "session" not in kwargs or kwargs["session"] is None:
            try:
                with Session(engine) as session:
                    kwargs["session"] = session
                    result = func(*args, **kwargs)
                    try:
                        session.commit()
                    except Exception  as e:
                        print(f"提交事务时出错: {e}")
                        session.rollback()
                    return result
            except Exception as e:
                print(f"链接数据库表时出错: {e}")
                return None
        else:
            return func(*args, **kwargs)
    return wrapper

login_try_times = 5
"""允许登录出错次数"""